#pragma once

#include"event_loop.h"
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/types.h>
#include "reactor_buf.h"
#include "message.h"
#include <arpa/inet.h>
#include"net_connection.h"


class tcp_client;

class tcp_client: public net_connection{

public:
    tcp_client(event_loop* loop, const char* ip, uint16_t port);

    // 发送消息方法
    virtual int send_message(const char* data, int msglen, int msgid);

    // 处理读事件
    void do_read();

    // 处理写事件
    void do_write();

    // 释放链接
    void clean_conn();

    // 链接服务器
    void do_connect();

    ~tcp_client();

    // server端的IP地址及端口
    struct sockaddr_in _server_addr;
    socklen_t _addrlen;

    // 输入缓冲
    input_buf ibuf;
    // 输出缓冲
    output_buf obuf;

    // 提供一个获取当前fd的函数
    virtual int get_fd(){
        return _sockfd;
    }

private:
    // 当前客户端的连接fd
    int _sockfd;

    // 客户端时间处理机制
    event_loop* _loop;


public:
    // 添加一个路由分发机制句柄
    msg_router _router;

    // 提供一个添加路由的方法
    void add_msg_router(int msgid, msg_callback *msg_cb, void* args = NULL); 



    // ============== 创建链接/销毁链接 Hook 部分 ====
    //设置链接的创建hook函数
    void set_conn_start(conn_callback cb, void *args = NULL);

    //设置链接的销毁hook函数
    void set_conn_close(conn_callback cb, void *args = NULL);

    //创建链接之后要触发的 回调函数
    conn_callback conn_start_cb;
    void *conn_start_cb_args;

    //销毁链接之前要触发的 回调函数
    conn_callback conn_close_cb;
    void *conn_close_cb_args;

};